package com.eoe.wiki.db.dao;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.text.TextUtils;

import com.eoe.wiki.WikiArgumentException;
import com.eoe.wiki.db.WikiColumn;
import com.eoe.wiki.db.entity.WikiEntity;
import com.eoe.wiki.utils.FileUtil;
import com.eoe.wiki.utils.L;

public class WikiDao extends GeneralDao<WikiColumn>{

	private UpdateDao updateDao;
	public WikiDao(Context context) {
		super(new WikiColumn(),context);
		updateDao = new UpdateDao(context);
	}
	
	public WikiEntity getWikiByPageId(String pageId){
		Cursor cursor = queryByParameter(WikiColumn.PAGE_ID, pageId);
		return buildWikiEntity(cursor);
	}
	
	public WikiEntity getWikiByUri(String uri){
		Cursor cursor = queryByParameter(WikiColumn.URI, uri);
		return buildWikiEntity(cursor);
	}
	
	public boolean saveOrUpdateWiki(String content,WikiEntity entity) throws WikiArgumentException{
		long id = entity.getId();
		if(id>0){
			return updateWiki(entity);
		}else{
			String pageId = entity.getPageId();
			if(TextUtils.isEmpty(pageId)){
				throw new WikiArgumentException("Need a pageId");
			}
			Cursor cursor = queryByParameter(WikiColumn.PAGE_ID, pageId);
			if(cursor!=null){
				if(cursor.getCount()>0){
					cursor.moveToFirst();
					int version = cursor.getInt(cursor.getColumnIndex(WikiColumn.VERSION));
					id = cursor.getLong(cursor.getColumnIndex(WikiColumn._ID));
					String path = cursor.getString(cursor.getColumnIndex(WikiColumn.PATH));
					cursor.close();
					if(version<entity.getVersion()||TextUtils.isEmpty(path)){
						L.e("need to update the wiki table");
						entity.setId(id);
						if(entity.saveWikiFile(content)){
							FileUtil.deleteFile(path);
							return updateWiki(entity);
						}
						L.e("update the wiki failed");
					}
					return false;
				}else{
					cursor.close();
					if(entity.saveWikiFile(content)){
						return saveWiki(entity);
					}
				}
			}
			return false;
		}
	}
	
	public boolean saveWiki(WikiEntity entity) throws WikiArgumentException{
		L.d("begin to save wiki:" + entity.getPageId());
		String pageId = entity.getPageId();
		if(TextUtils.isEmpty(pageId)){
			throw new WikiArgumentException("Need a pageId for updating");
		}
		long current = System.currentTimeMillis();
		if(entity.getAddDate()==0){
			entity.setAddDate(current);
		}
		if(entity.getModifyDate()==0){
			entity.setModifyDate(current);
		}
		if(insert(change2ContentValues(entity))!=null){
			updateDao.addOrUpdateTime(entity.getUri());
			return true;
		}
		return false;
	}
	public boolean updateWiki(WikiEntity entity) throws WikiArgumentException{
		L.d("begin to update the wiki:" + entity.getId());
		long id = entity.getId();
		if(id<0){
			throw new WikiArgumentException("Need a id for updating");
		}
		String pageId = entity.getPageId();
		if(TextUtils.isEmpty(pageId)){
			throw new WikiArgumentException("Need a pageId for updating");
		}
		long current = System.currentTimeMillis();
		entity.setModifyDate(current);
		entity.setAddDate(0);
		if(update(change2ContentValues(entity))>0){
			updateDao.addOrUpdateTime(entity.getUri());
			return true;
		}
		return false;
	}
	
	public WikiEntity buildWikiEntity(Cursor cursor){
		WikiEntity entity = null;
		if(cursor!=null&&cursor.moveToFirst()){
			entity = new WikiEntity();
			entity.setId(cursor.getLong(cursor.getColumnIndex(WikiColumn._ID)));
			entity.setAddDate(cursor.getLong(cursor.getColumnIndex(WikiColumn.DATE_ADD)));
			entity.setDisplayTitle(cursor.getString(cursor.getColumnIndex(WikiColumn.DISPLAY_TITLE)));
			entity.setModifyDate(cursor.getLong(cursor.getColumnIndex(WikiColumn.DATE_MODIFY)));
			entity.setPageId(cursor.getString(cursor.getColumnIndex(WikiColumn.PAGE_ID)));
			entity.setPath(cursor.getString(cursor.getColumnIndex(WikiColumn.PATH)));
			entity.setUri(cursor.getString(cursor.getColumnIndex(WikiColumn.URI)));
			entity.setVersion(cursor.getInt(cursor.getColumnIndex(WikiColumn.VERSION)));
		}
		if(cursor!=null){
			cursor.close();
		}
		return entity;
	}
	
	public ContentValues change2ContentValues(WikiEntity entity){
		ContentValues values = new ContentValues();
		if(entity.getId()>0){
			values.put(WikiColumn._ID, entity.getId());
		}
		if(entity.getAddDate()>0){
			values.put(WikiColumn.DATE_ADD, entity.getAddDate());
		}
		if(entity.getModifyDate()>0){
			values.put(WikiColumn.DATE_MODIFY, entity.getModifyDate());
		}
		if(entity.getVersion()>0){
			values.put(WikiColumn.VERSION, entity.getVersion());
		}
		if(TextUtils.isEmpty(entity.getDisplayTitle())){
			values.put(WikiColumn.DISPLAY_TITLE, entity.getDisplayTitle());
		}
		if(TextUtils.isEmpty(entity.getPath())){
			values.put(WikiColumn.PATH, entity.getPath());
		}
		if(TextUtils.isEmpty(WikiColumn.URI)){
			values.put(WikiColumn.URI, entity.getUri());
		}
		if(TextUtils.isEmpty(WikiColumn.PAGE_ID)){
			values.put(WikiColumn.PAGE_ID, entity.getPageId());
		}
		return values;
	}
}
